﻿#pragma once

#ifndef ARD_PSTATE
#define ARD_PSTATE

/*
*	状态寄存器
* 该程序和备份程序状态寄存器(SPSR_ELx)是一对
* 当异常发生时，处理器会将PSTATE寄存器的值保存到当前异常级别对应的SPSR_ELx寄存器；当异常返回时(eret)，处理器会将SPSR_ELx寄存器的值恢复到PSTATE寄存器。这是硬件自动行为，不需要编程人员操作。
* 其中N、Z、C、V可以在EL0访问，其他字段在EL0是未定义状态，需要在EL1或者更高级访问或执行。
*/
typedef struct _PSTATE
{
	uint8_t n : 1;  //1:结果为负数				0:结果为正数
	uint8_t z : 1;	//1:结果为0					0:结果为非0
	uint8_t c : 1;	//1:结果为无符号溢出		0:
	uint8_t v : 1;	//1:结果为有符号溢出		0:
	uint8_t d : 1;	//1:打开调试断点和软件单步	0:
	uint8_t a : 1;	//1:屏蔽系统错误			0:
	uint8_t i : 1;	//1:屏蔽IRQ					0:
	uint8_t f : 1;	//1:屏蔽FIQ					0:
	uint8_t ss : 1;	//1:软件单步				0:
	uint8_t il : 1;	//1:不合法的异常			0:
	uint8_t el : 2;	//异常等级
	uint8_t rw : 1;	//1:AArch32位				0:AArch64位
	uint8_t sp : 1;	//1:选择SP_EL0或者SP_ELn	0:选择SP_EL0
	uint8_t m : 5;
	uint8_t e : 1;
	uint8_t sm : 1; //Streaming SVE mode enabled [SME] 

	_PSTATE() {
		e = 0; sm = 0; m = 0;	n = 0; z = 0; c = 0; v = 0; d = 0; a = 0; i = 0; f = 0; ss = 0; il = 0; el = 0; rw = 0; sp = 0;
	}
}PSTATE;

#endif // !ARD_PSTATE
